# -*- coding: utf-8 -*-

from osv import fields,osv
from osv.orm import browse_record
import tools
from functools import partial
import pytz
import pooler
from tools.translate import _
from service import security
import netsvc

class aas_subject_type(osv.osv):
    _name = 'aas.subject.type'
    _description = 'Loại môn học'
    _columns = {
        'name': fields.char('Tên loại môn học', size=64, required=True),
    }
    _sql_constraints = [
#        ('name_uniq', 'UNIQUE(name)', 'The name of the subject type must be unique!'),
    ]
    
    def copy(self, cr, uid, id, default=None, context=None):
        if not default:
            default = {}
        subject = self.browse(cr, uid, id, context=context)
        default.update({
            'name': subject.name + ' (copied)',
        })
        return super(aas_subject_type, self).copy(cr, uid, id, default, context)
    
aas_subject_type()

class aas_subject_subject(osv.osv):
    
    def onchange_credit(self, cr, uid, ids, th_credit, pr_credit, context=None):
        result = {'value': {'total_credit': th_credit + pr_credit}}
        return result
    
    def _total_credit(self, cr, uid, ids, field_name, arg, context=None):
        result = {}
        for subject in self.browse(cr, uid, ids, context=context):
            result[subject.id] = subject.th_credit + subject.pr_credit
        return result
        
    _name = 'aas.subject.subject'
    _description = 'Môn học'
    _columns = {
        'name': fields.char('Tên môn học', size=64, required=True),
        'code': fields.char('Mã môn học', size=64, required=True),
        'type': fields.many2one('aas.subject.type', string='Loại môn học', required=True),
        'th_credit': fields.integer('Số tín chỉ lý thuyết', required=True),
        'pr_credit': fields.integer('Số tín chỉ thực hành', required=True),
        'total_credit': fields.function(_total_credit, string='Tổng số tín chỉ', method=True, readonly=True, type='integer'),
        'min_mark': fields.float('Điểm số tối thiểu yêu cầu'),
        'pre_subjects': fields.many2many('aas.subject.subject', 'aas_subject_subject_pre_rel', 'subject_id', 'pre_subject_id', 'Các môn học tiên quyết'),
        'eqvl_subjects': fields.many2many('aas.subject.subject', 'aas_subject_subject_eqvl_rel', 'subject_id', 'eqvl_subject_id', 'Các môn học tương đương'),
        'dept_id': fields.many2one('aas.department', string='Khoa', help='Khoa mà môn học này chịu sự quản lý trực tiếp.'),
    }
    _defaults = {
        'th_credit': lambda *a: 0,
        'pr_credit': lambda *a: 0,
        'min_mark': lambda *a: 5.0,
    }
    _sql_constraints = [
#        ('code_uniq', 'UNIQUE(code)', 'The code of the subject type must be unique!'),
    ]
    
    def confirm(self, cr, uid, ids, context=None):
        self.write(cr, uid, ids, {'state': 'confirmed'})
        return True
    
    def approve(self, cr, uid, ids, context=None):
        self.write(cr, uid, ids, {'state': 'approved'})
        return True
    
    def refuse(self, cr, uid, ids, context=None):
        self.write(cr, uid, ids, {'state': 'draft'})
        return True
    
    def set_back_to_draft(self, cr, uid, ids, context=None):
        self.write(cr, uid, ids, {'state': 'draft'})
        return True
    
aas_subject_subject()


class aas_department(osv.osv):
    _inherit = 'aas.department'
    _columns = {
        'subjects': fields.one2many('aas.subject.subject', 'dept_id', string='Các môn học khoa quản lý.', readonly=True),        
    }
aas_department()

class aas_frame_detail(osv.osv):
    
    def default_frame_id(self, cr, uid, context=False):
        if not context: context = {}
        res = context.get('frame_id', False)
        return res
    
    _name = 'aas.frame.detail'
    _columns = {
        'name': fields.char('/', size=128),
        'frame_id': fields.many2one('aas.frame', string='Chương trình đào tạo', required=True, ondelete='cascade'),
        'subject_id': fields.many2one('aas.subject.subject', string='Tên môn học', required=True),
        'subject_code': fields.related('subject_id', 'code', type='char', size=64, string='Mã môn học', readonly=True),
        'type': fields.related('subject_id', 'type', type='many2one', relation='aas.subject.type', string='Loại môn học', readonly=True),
        'total_credit': fields.related('subject_id', 'total_credit', type='integer', string='Tổng số tín chỉ', readonly=True),
        'min_mark': fields.related('subject_id', 'min_mark', type='float', string='Điểm số tối thiểu yêu cầu', readonly=True),
        'semester': fields.integer('Học kỳ thứ', required=True),
    }
    _defaults = {
        'frame_id': default_frame_id,
        'semester': lambda *a: 1,
        'name': lambda *a: '/',
    }
    _order = 'semester'
    
    def get_name_from_subject_id(self, cr, uid, subject_id, context=False):
        res = ''
        if subject_id:
            subject_obj = self.pool.get('aas.subject.subject')
            subject = subject_obj.browse(cr, uid, subject_id, context=context)
            res = subject.code + ' - ' + subject.name
        return res
    
    def create(self, cr, uid, vals, context=False):
        if vals.has_key('subject_id'):
            name = self.get_name_from_subject_id(cr, uid, vals['subject_id'], context=context)
            vals.update({'name': name})
        return super(aas_frame_detail, self).create(cr, uid, vals, context=context)
    
    def write(self, cr, uid, ids, vals, context=False):
        if vals.has_key('subject_id'):
            name = self.get_name_from_subject_id(cr, uid, vals['subject_id'], context=context)
            vals.update({'name': name})
        return super(aas_frame_detail, self).write(cr, uid, ids, vals, context=context)
aas_frame_detail() 

class aas_frame(osv.osv):
    
    def function_depts_str(self, cr, uid, ids, field_name, args, context=False):
        res = {}
        for obj in self.browse(cr, uid, ids, context=context):
            string = ''
            for dept in obj.depts:
                if string: string += ', '
                string += dept.name
            res[obj.id] = string
        return res
    
    def function_sessions_str(self, cr, uid, ids, field_name, args, context=False):
        res = {}
        for obj in self.browse(cr, uid, ids, context=context):
            string = ''
            for session in obj.sessions:
                if string: string += ', '
                string += session.name
            res[obj.id] = string
        return res
    
    _name = 'aas.frame'
    _columns = {
        'name': fields.char('Tên chương trình đào tạo', size=128, required=True),
        'details': fields.one2many('aas.frame.detail', 'frame_id', string='Chi tiết chương trình đào tạo'),
        'number_of_credits': fields.integer('Số tín chỉ yêu cầu', required=True),
        'depts': fields.many2many('aas.department', 'frames_depts_rel', 'frame_id', 'dept_id', string='Dành cho các khoa'),
        'depts_str': fields.function(function_depts_str, method=True, type='text', string='Dành cho các khoa'),
        'sessions': fields.many2many('aas.academic.session', 'frames_sessions_rel', 'frame_id', 'session_id', string='Dành cho các khóa'),
        'sessions_str': fields.function(function_sessions_str, method=True, type='text', string='Dành cho các khóa'),
    }
    _defaults = {
        'number_of_credits': lambda *a: 100,
    }
aas_frame()

class aas_user(osv.osv):
    _inherit = 'res.users'
    _columns = {
        'frame_id': fields.many2one('aas.frame', string='Chương trình đào tạo'),
    }
aas_user()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
